/*
******************************************************************************************************* 
**  Copyright (C) 2019, 苏州检易生物科技有限公司 
**  All rights reserved. 
** 
**  FileName:       	can.h
**  Description:	
**  Author:        	 
**  Version				v0.1
**  Date:           	2019-05-30
**	Function List： 
**  History:         
*********************************************************************************************************
*/
/*
*********************************************************************************************************
*                                              	防止重复包含
*********************************************************************************************************
*/

#ifndef _CAN_H_
#define _CAN_H_
/*
*********************************************************************************************************
*                                              	调试开关
*********************************************************************************************************
*/



/*
*********************************************************************************************************
*                                              	头文件
*********************************************************************************************************
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "stm32H7xx.h"
#include "stm32H7xx_hal_fdcan.h"
#ifdef RTOS
#include <rtthread.h>
#include <rthw.h>
#endif

/*
*********************************************************************************************************
*                                              	宏定义
*********************************************************************************************************
*/
#define CAN_MAX_SIZE	8

/*
*********************************************************************************************************
*                                              枚举和结构体类型定义
*********************************************************************************************************
*/

typedef enum{
	CAN_ERR_NONE,
	CAN_ERR_TX,
	CAN_ERR_INIT,
	CAN_ERR_BUSY,
}can_err_t;

typedef struct BSP_CAN_HANDLE{
	FDCAN_HandleTypeDef hal_can_handle;
	can_err_t can_err;
	uint16_t 	can_id;
	
	void (*rx_callback)(struct BSP_CAN_HANDLE* handle,uint16_t src_can_id, uint8_t *buff,uint8_t len);
	void (*tx_callback)(struct BSP_CAN_HANDLE* handle);
}bsp_can_t;

typedef void (*bsp_can_rx_callback)(struct BSP_CAN_HANDLE* handle,uint16_t src_can_id, uint8_t *buff,uint8_t len);
typedef void (*bsp_can_tx_callback)(struct BSP_CAN_HANDLE* handle);
/*
*********************************************************************************************************
*                                              	全局变量声明
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                              	函数声明
*********************************************************************************************************
*/
bsp_can_t*	bsp_can_init(FDCAN_GlobalTypeDef* can,uint16_t can_id,uint32_t baudrate);
can_err_t		bsp_can_cb_reg(bsp_can_t* handle,bsp_can_rx_callback pfn_rx_cb,bsp_can_tx_callback pfn_tx_cb);
can_err_t		bsp_can_close(bsp_can_t* handle);
uint8_t 		bsp_can_recv(bsp_can_t* handle,uint8_t *buff);
can_err_t 	bsp_can_send(bsp_can_t* handle,uint16_t dest_can_id, uint8_t *buff,uint8_t len);
can_err_t   bsp_can_tx_available(bsp_can_t* handle);
#endif
